var TableConstructor = function() {
    var _self = this;
    _self.createTableHTML = function(options) {
        /* bitno je napomenuti da ovo ima smisla koristiti samo ako je prethodno 
         * napravljen holder div u kojem se nalazi html koji ce sadrzati redove 
         * (html koji sadrzi definiciju tabele (klasu, id, maksimalnu visinu) 
         * - primer je u PackagingOverviewTable.html)
         * 
         * parametar funkcije options je json koji sadrzi sledece ulaze:
         * 1) options.response - json response
         * 2) options.tableClass - css klasa tabele
         * 3) options.scrollable - opcioni parametar koji pomaze pri injekciji html-a u table holder. 
         *    Tabela koja je skrolabilna ima drugaciji html, pa je zbog toga bitno proslediti info
         * 4) options.desc predstavlja opis tabele
         * primer:
         description = [
         {
         param : 'ID'
         },
         {
         param : 'Date',
         width : '20'
         },
         
         ...
         
         {
         param : 'Min',
         width : '10'
         }
         ];
         * param je ulaz u response json, width je sirina kolone. Ukoliko nema width, 
         * znaci da taj json objekat sadrzi samo param preko kojeg se uzima ID za data-id
         * primer html-a koji odgovara jednom redu u tabeli (## su markeri koji 
         * po nazivu odgovaraju ulazima u response json):
         * <div class="clearfix row data" data-id="#ID#">
         *  <div class="col w20">#Date#</div>\n\
         *  <div class="col w10">#Item#</div>\n\
         *  <div class="col w30">#Description#</div>\n\
         *  <div class="col w20">#Order#</div>\n\
         *  <div class="col w10">#Line#</div>\n\
         *  <div class="col w10">#Min#</div>
         * </div>
         */

        //kreiranje row paterna
        var x = 0;
        var desc = options.desc;
        var scrollable = options.scrollable;
        var sortable = options.sortable;
        var response = options.response;
        var tableClass = options.tableClass;
        var useHook = options.useHook; //hook sadrzi ID, nekada nije potrebno da postoji, recimo, 
        //ako tabela treba samo da prikaze podatke, 
        //bez ikakve manipulacije njima ili koriscenja istih 
        //za druge elemente na stranici. Ukoliko se hook ne koristi, 
        //u json-u ovaj ulaz ne sme da postoji


        //kreiranje paterna jednog row-a. Markeri su obelezeni sa ## 
        //i koriste se za kasniji replace sa pravim vrednostima is responsa.
        //console.log(options);
        var row = "<div class='clearfix row #ROLE#' #HOOK#>";
        var header = "<div class='clearfix row #ROLE#' #HOOK#>";
        for (var i = x; i < desc.length; i++) {
            if (desc[i].param !== 'ID') {

                row += "<div class='col w" + desc[i].width;
                header += "<div class='col w" + desc[i].width;

                if (desc[i].copyValueAsClass) {
                    row += " #COPY_VALUE_AS_CLASS___" + desc[i].copyValueAsClass + "#";
                    header += " #COPY_VALUE_AS_CLASS___" + desc[i].copyValueAsClass + "#";
                }

                row += "'>#" + desc[i].param;
                header += "'>#" + desc[i].param;

                if (desc[i].sort) {
                    if(options.sortItem != undefined && desc[i].param == options.sortItem){
                        header += "#<i class='icon sort "+ options.ascDesc + "'></i>";
                    }
                    else
                        header += "#<i class='icon sort'></i>";
                }else{
                    header += "#";
                }

                row += "#</div>";
                header += "</div>";
            }
        }
        row += "</div>";
        header += "</div>";

        //kreiranje headera tabele
        header = header.replace("#ROLE#", "header").replace("#HOOK#", "");
        for (var i = x; i < desc.length; i++) {
            header = header.replace("#" + desc[i].param + "#", desc[i].title);
        }

        $("#" + tableClass).html(header.toString());

        //kreiranje kompletne tabele na osnovu responsa i row paterna
        var html = new StringBuilder();

        $.each(response, function(index, value) {
            var _row = row.replace("#ROLE#", "data");
            if (useHook === 'true') {
                _row = _row.replace("#HOOK#", "data-id='#ID#'");
            }
            else {
                _row = _row.replace("#HOOK#", "");
            }
            for (var i = 0; i < desc.length; i++) {
                if (desc[i].type) {
                    if (desc[i].type === 'checkbox') {
                        var cbhtml = "<input type='checkbox'/>";
                        if (value[desc[i].param].toString() === '1') {
                            cbhtml = "<input type='checkbox' checked='true'/>";
                        }
                        _row = _row.replace("#" + desc[i].param + "#", cbhtml);
                    }
                } 
                else {
                    _row = _row.replace("#" + desc[i].param + "#", "" + value[desc[i].param])
                            .replace("#COPY_VALUE_AS_CLASS___" + desc[i].param + "#", "" + value[desc[i].param]);
                }

            }
            html.append(_row);
        });
        //dodavanje skrol efekta
        if (scrollable === 'true') {
            $(".scrollable")
                    .find("." + tableClass)
                    .html(html.toString());
        }
        else {
            $("#" + tableClass)
                    .append(html.toString());
        }
    };
    _self.generateTable = function(options, callback) {
        /*
         * options parameter:
         * options.request required
         * callback moze da bude anonimna funkcija ili naziv funkcije
         * primer za anonimnu: generateTable({key : value}, function(){alert()});
         */
        var random = Math.random();
        var url = "js/tableParams/" + options.request + ".json?x=" + random;
        $.get(url, function(responseParams) {
            if (options.response) {
                //simulacija kad se koristi mockup
                //kada vec imam response i ne zelim opet da saljem ajax,
                //ocekujem ga u options parametru
                //proverim da li je nasetovan, pa ako jeste, samo ga zalepim 
                //na ostale table parametre na osnovu kojih se kreira tabela i 
                //tako izbegnem slanje nepotrebnog ajax poziva.
                responseParams.response = options.response;
                _self.createTableHTML(responseParams);
                if (callback) {
                    callback();
                }
            } else {
                var requestParams = _self.generateTableRequestParams(options);
                window.backendInterface.getData(window.CONSTANTS.SERVICE_URL, requestParams, function(response) {
                            responseParams.response = response;
                            responseParams = jsonConcat(responseParams,requestParams);
                            _self.createTableHTML(responseParams);
                            if (callback) {
                                callback();
                            }
                        });
            }
        });
    };
    _self.generateTableRequestParams = function(options) {
        /*
         * Sprema request parametre na osnovu kojih ce dobiti sadrzaj tabele 
         * u json formatu.
         * Ukoliko se options.request parametar zavrsava sa 0, 
         * dohvatiti parametre na osnovu timeFilter-a.
         * Na kraju sve parametre smestiti u jedan json i vratiti
         */
        var request = options.request;
        var params = {};
        if (request.toString()[request.toString().length - 1] === "0") {
            params = _self.getTimeFilterParams();
        }
        return jsonConcat(params, options);
    };
    _self.getTimeFilterParams = function() {
        var params = {};
        var type = $(".timeFilter .radio:checked").data('type');

        if (parseInt($('.timeFilter .hook_line').val()) > 0) {
            params.line = $('.timeFilter .hook_line').val();
        }

        if (parseInt($('.timeFilter .hook_shift').val()) > 0) {
            params.line = $('.timeFilter .hook_shift').val();
        }

        switch (type) {
            case 'period':
                params.pStart = $('.timeFilter .hook_dateFrom').val();
                if ($('.timeFilter .hook_oneDay').is(":checked")) {
                    params.pOneDay = 'oneDay';
                } else {
                    params.pEnd = $('.timeFilter .hook_dateTo').val();
                }
                params.timeFrame = 'period';
                break;
            case 'month':
                params.mMonth = $('.timeFilter .hook_mMonth').val();
                params.mYear = $('.timeFilter .hook_mYear').val();
                params.timeFrame = 'month';
                break;
            case 'year':
                params.yYear = $('.timeFilter .hook_yYear').val();
                params.timeFrame = 'year';
                break;
        }
        return params;
    };
};
$.fn.addScroll = function() {
    var scrollable = $("<div class='scrollable'><div class='" + $(this).attr('class') + "'></div></div>");
    $(this).after(scrollable);
    var tbl = scrollable.find(".tbl");
    $(this).find(".row.data").detach().appendTo(tbl);
//    var height = 200;
//    if ($(this).data("max-height")) {
//        height = $(this).data("max-height");
//    }
    scrollable.css("height", "90%");
    scrollable.css("width", (parseInt(tbl.width()) + 29) + "px");
};



